package com.itheima.reggie.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.utils.BaseContext;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

/*
    自定义的元数据对象处理器
        其实就是告诉mybatisplus，给我们前面在JavaBean里面指定的公共字段赋值。
        
        1. 定义类，实现接口 MetaObjectHandler
        
        2. 重写方法： insertFill  updateFill
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    
    //简单的处理办法就是在这里注入进来HTTPSession
    @Autowired
    private HttpSession session;
    
    
    /**
     * 插入元对象字段填充（用于插入时对公共字段的填充）
     *
     * @param metaObject 元对象
     */
    
    public void insertFill(MetaObject metaObject ) {
        System.out.println("来调用添加填充字段的方法了~！~！~");
        metaObject.setValue("createTime" , LocalDateTime.now());
        metaObject.setValue("updateTime" , LocalDateTime.now());
        
        //可以从session里面取出来员工对象，然后得到id值
        Employee employee  = (Employee) session.getAttribute("employee");
        
//        metaObject.setValue("createUser" , employee.getId());
//        metaObject.setValue("updateUser" , employee.getId());
        
        //换成ThreadLocal的写法！
        metaObject.setValue("createUser" , BaseContext.get());
        metaObject.setValue("updateUser" ,  BaseContext.get());
    }
    
    /**
     * 更新元对象字段填充（用于更新时对公共字段的填充）
     *
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("=====================updateFill的ID：：：" + Thread.currentThread().getId());
        System.out.println("来调用更新填充字段的方法了~！~！~");
        metaObject.setValue("updateTime" , LocalDateTime.now());
    
        Employee employee  = (Employee) session.getAttribute("employee");
//        metaObject.setValue("updateUser" , employee.getId());
    
        //换成ThreadLocal的写法！
        metaObject.setValue("updateUser" , BaseContext.get());
    }
}
